<?php
/**
 * 功能：框架入口文件
 * 说明：SlimPHP框架
 * 创建日期：2012-03-13
 * 更新日期：
 * 作者：Mirze
 * 补充说明： 
 * 
 */
//记录开始运行时间
$GLOBALS['_beginTime'] = microtime(TRUE);

define('DS', DIRECTORY_SEPARATOR); //DIRECTORY_SEPARATOR 的简写

//define('SLIM_DIR', dirname(__FILE__) . DS);
// 项目名称
//defined('APP_NAME') or define('APP_NAME', basename(dirname($_SERVER['SCRIPT_FILENAME'])));

//$defineArray = require('Init/define.php');
//parse_define($defineArray); //define定义

// 载入核心函数库
require("Init/function.php");

//载入全局类名文件
global $G_CLASS_FILES;
if (empty($G_CLASS_FILES)){
    require "Init/global_class_files.php";
}

class Slim {
	var $c = "Index"; //controller
	var $a = "index"; //action
	var $_app_config = array();

	/**  **/
	public function __construct(array $app_config)
	{
		$this->_app_config =$app_config;
		$this->_library_path = dirname(__FILE__); //框架library路径
		$this->initDefine();
	}

	/** define  **/
	function initDefine()
	{
		$libPath = $this->_library_path;
		if(! defined('SLIM_CORE')) define('SLIM_CORE', $libPath . '/Core');
		if(! defined('SLIM_DB')) define('SLIM_DB', $libPath . '/DB');
		if(! defined('SLIM_EXTEND')) define('SLIM_EXTEND', $libPath . '/Extend');
	}

	/**
	 * (功能描述)
	 *
	 * @param 
	 * @return
	 */
	function run()
	{
		 // 获得请求对应的 UDI（统一目的地信息）
		$udi = $this->requestUDI('array');

		$className = "Controller_" . $udi->c;
		$controllerName = strtolower($className) . ".php";
		$controllerDir = $this->_app_config['APP_DIR'] . '/controller/' ;
		$controllerFile = $controllerDir .$controllerName;

		require_once(SLIM_CORE . "/Controller_abstract.php");

		if (!class_exists($className, false)) {
			$this->loadClass($className, $controllerDir);
		}

		$controller = new $className();

		$actionName = "action" . ucfirst($udi->a);
		if(method_exists($controller, $actionName)) {
			 // 如果指定动作存在，则调用
			 $response = $controller->$actionName();
		 } else {
			 echo "action access fail.";exit;
		 }

		dump($this);
	}

	/**
	 * (功能描述) 返回当前请求对应的 UDI
	 *
	 * 将当前请求中包含的控制器、动作提取出来，构造为一个 UDI。
	 *
	 * @param 
	 * @return
	 */
	public function requestUDI()
	{
		$udi = $this->normalizeUDI();
		$this->c = $udi['c'];
		$this->a = $udi['a'];
		return $this;
	}

	/**
	 * (功能描述) 返回规范化以后的 UDI 数组
	 *
	 * @param 
	 * @return
	 */
	function normalizeUDI()
	{
		 // 从 $_GET 中提取请求参数
        $keys = array_keys($_GET);
        if (!empty($keys))
        {
            $keys = array_combine($keys, $keys);
            $keys = array_change_key_case($keys);
        }

		$udi['c'] = (isset($keys['c'])) ? $_GET[$keys['c']] : $this->c;
        $udi['a'] = (isset($keys['a'])) ? $_GET[$keys['a']] : $this->a;

		return $udi;
	}


	/**
	 * (功能描述)
	 *
	 * @param 
	 * @return
	 */
	function autoLoad($className)
	{
		self::loadClass($className, null, false);
	}

	/**
	 * (功能描述)
	 *
	 * @param 
	 * @return
	 */
	function loadClass($className, $dirs = null, $throw = true)
	{
		 if (class_exists($className, false) || interface_exists($className, false))
        {
            return $className;
        }

		global $G_CLASS_FILES;
		$classNameLower = strtolower($className);
        if (isset($G_CLASS_FILES[$classNameLower]))
        {
            require $G_CLASS_FILES[$classNameLower];
            return $classNameLower;
        }

		if(!empty($dirs) && !is_array($dirs)) {
			$path = $dirs . DS . ucfirst($className) . '.php';
		} else {
		    $path = ucfirst($className) . '.php';
		}
		require $path;

		if (!class_exists($className, false) && ! interface_exists($className, false))
        {
			$msg = sprintf('Class "%s" declare file "%s" ', $className, $path);
			throw new SlimException($msg);
			return false;
		}
		return $className;
	}

	/** 析构函数 **/
	function __destruct()
	{
	}


}

?>